package zhenniu.best.webview.zhenniuwebview;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.Application;
import android.app.Service;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;


import com.blankj.utilcode.util.SPUtils;
import com.blankj.utilcode.util.Utils;
import com.tencent.smtt.sdk.QbSdk;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;


import zhenniu.best.webview.zhenniuwebview.global.Constants;
import zhenniu.best.webview.zhenniuwebview.utils.preventCrash.Cockroach;

/**
 * Created by Administrator on 2018/1/30.
 *
 */

public class ZhenNiu extends Application {
    public static Context context;
    public  static Handler mainHandler;

    /**用来判断是否要使用冷启动（重启App）的方式使补丁生效*/
    public static boolean isRelaunch = false;

    //activity 和 service 的集合
    private static List<Activity> activitys = new LinkedList<Activity>();
    private static List<Service> services = new LinkedList<Service>();
    public static SPUtils spUtils;

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
        mainHandler = new Handler();
        init();
    }

    private void init() {
        // init it in the function of onCreate in ur Application
        Utils.init(this);
        spUtils = SPUtils.getInstance(Constants.ZHEN_NIU);

        //腾讯X5内核--------------------------------------------------------------
        //搜集本地tbs内核信息并上报服务器，服务器返回结果决定使用哪个内核。
        QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {

            @Override
            public void onViewInitFinished(boolean arg0) {
                // 在这里你可以做一些关于x5加载的操作
                //x5內核初始化完成的回调，为true表示x5内核加载成功，否则表示x5内核加载失败，会自动切换到系统内核。

            }

            @Override
            public void onCoreInitFinished() {
                // TODO Auto-generated method stub
            }
        };
        //x5内核初始化接口
        QbSdk.initX5Environment(getApplicationContext(),  cb);
        //腾讯X5内核--------------------------------------------------------------

        //防崩溃
        preventBug();
    }

    public static Context getContext() {
        return context;
    }

    /**
     * 装载防崩溃工具
     */
    private void preventBug() {
        Cockroach.install(new Cockroach.ExceptionHandler() {

            // handlerException内部建议手动try{  你的异常处理逻辑  }catch(Throwable e){ } ，以防handlerException内部再次抛出异常，导致循环调用handlerException

            @Override
            public void handlerException(final Thread thread, final Throwable throwable) {
                //开发时使用Cockroach可能不容易发现bug，所以建议开发阶段在handlerException中用Toast谈个提示框，
                //由于handlerException可能运行在非ui线程中，Toast又需要在主线程，所以new了一个new Handler(Looper.getMainLooper())，
                //所以千万不要在下面的run方法中执行耗时操作，因为run已经运行在了ui线程中。
                //new Handler(Looper.getMainLooper())只是为了能弹出个toast，并无其他用途
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            //建议使用下面方式在控制台打印异常，这样就可以在Error级别看到红色log
                            Log.e("AndroidRuntime","--->CockroachException:"+thread+"<---",throwable);

//                        throw new RuntimeException("..."+(i++));
                        } catch (Throwable e) {

                        }
                    }
                });
            }
        });
    }


    /**
     * 往集合里添加activity
     * @param activity
     */
    public static void addActivity(Activity activity) {
        activitys.add(activity);
    }

    /**
     * 从集合里移除activity
     * @param activity
     */
    public static void removeActivity(Activity activity) {
        activitys.remove(activity);
    }

    public static void addService(Service service) {
        services.add(service);
    }

    public static void removeService(Service service) {
        services.remove(service);
    }

    /**
     * 退出应用需要关闭的东西
     */
    public static void closeApplication() {
        closeActivitys();
//        closeServices();

        //如果杀死进程，退出应用的瞬间会黑屏，看看是否有方法能避免黑屏
//        killProcess();

//        android.os.Process.killProcess(android.os.Process.myPid());
    }

    /**
     * 关闭activity
     */
    public static void closeActivitys() {
        ListIterator<Activity> iterator = activitys.listIterator();
        while (iterator.hasNext()) {
            Activity activity = iterator.next();
            if (activity != null) {
                activity.finish();
            }
        }
    }

    /**
     * 关闭服务
     */
//    private static void closeServices() {
//        ListIterator<Service> iterator = services.listIterator();
//        while (iterator.hasNext()) {
//            Service service = iterator.next();
//            if (service != null) {
//                getContext().stopService(new Intent(getContext(), service.getClass()));
//            }
//        }
//    }

    /**
     * 杀死进程
     */
    private static void killProcess() {
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> list = activityManager.getRunningAppProcesses();
        Collections.reverse(list);
        for (ActivityManager.RunningAppProcessInfo info : list
                ) {
            android.os.Process.killProcess(info.pid);
        }
    }
}
